/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package iot;

import com.google.gson.JsonParser;
import jdk.nashorn.internal.codegen.CompilerConstants;
import net.sf.json.JSONArray;

/**
 *
 * 解码服务器代码 输入：数据 返回：解码状态 地址：正确，null：错误。
 */
public class decode {

    public static String decodeSerial(byte[] byte_data) {
        int i_byte_decode_data = 0; //解码后的数据长度
        byte[] byte_decode_data = new byte[byte_data.length - 2];
//        byte[] byte_decode_return = new byte[byte_data.length - 2 - 2 - 3 - 1];
        int int_data_length = byte_data.length - 1;
        if ((byte_data[0] & 0xff) != 0xAA && (byte_data[int_data_length] & 0xff) != 0xBB) {//帧头帧尾判断数据的合法性
            System.out.println("接收数据错误！");
            return "error";
        } else {
            int int_data_tmp = 0;
            for (int i = 1; i < int_data_length; i++) {
                if (byte_data[i] == (byte) 0XCC) {
                    switch (byte_data[++i]) {
                        case 0x01:
                            byte_decode_data[int_data_tmp++] = (byte) 0xAA;
                            break;
                        case 0x02:
                            byte_decode_data[int_data_tmp++] = (byte) 0xBB;
                            break;
                        case 0x03:
                            byte_decode_data[int_data_tmp++] = (byte) 0xCC;
                            break;
                        default:
                            byte_decode_data[int_data_tmp++] = byte_data[--i];
                            break;
                    }
                } else {
                    byte_decode_data[int_data_tmp++] = byte_data[i];
                }
            }
            byte[] byte_decode_data_finale = new byte[int_data_tmp];

            for (int i = 0; i < int_data_tmp; i++) {
                byte_decode_data_finale[i] = byte_decode_data[i];
            }
            //CRC校验
            int int_crc = CRC16Util.calcCrc16(byte_decode_data_finale);
            int int_data_crc = (((int) byte_decode_data_finale[byte_decode_data_finale.length - 2] << 8) & 0x0000ffff) + ((int) byte_decode_data_finale[byte_decode_data_finale.length - 1] & 0x000000ff);
            if (int_crc != int_data_crc) {
                System.out.println("CRC check error");
                return "error";
            }
            byte[] byte_decode_return_finale = new byte[byte_decode_data_finale.length - 2 - 3 - 1];
            for (int i = 0; i < byte_decode_data_finale.length - 2 - 3 - 1; i++) {
                byte_decode_return_finale[i] = byte_decode_data_finale[i + 3];//去掉前面的帧长度 2 +指令 1
            }
//            //byte 转 字符串
//            String returnString = new String()
            String str = new String(byte_decode_return_finale);
            str = JsonDecode(str);
            return str;

        }
    }

    /*
     JSON解析
     */
    private static String JsonDecode(String str) {
        System.out.printf("str=%d\r\n", str.length());
        String strReturn = "[" + str + "]";
        System.out.printf("strReturn=%d\r\n", strReturn.length());
        System.out.printf(strReturn + "\r\n");
        JSONArray jsonArray = JSONArray.fromObject(strReturn);

        for (int i = 0; i < jsonArray.size(); i++) {
            str = jsonArray.getJSONObject(i).getString("ID");
        }
        return str;
    }
}
